INTRODUÇÃO AO PYTHON - OUTROS TÓPICOS IMPORTANTES

Autor

João Ricardo F. de Lima

Data de Publicação

4 de junho de 2024

Visualizando dados com o Matplotlib e Seaborn

#Bibliotecas

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from bcb import sgs
ipca = sgs.get({'IPCA': 433}, start = "2010-01-01")
desemprego = sgs.get({'desemprego': 24369})  #pnad continua
data = desemprego.merge(ipca, on = 'Date', how = 'left')
data
desemprego IPCA
Date
2012-03-01 8.0 0.21
2012-04-01 7.8 0.64
2012-05-01 7.7 0.36
2012-06-01 7.6 0.08
2012-07-01 7.5 0.43
... ... ...
2023-12-01 7.4 0.56
2024-01-01 7.6 0.42
2024-02-01 7.8 0.83
2024-03-01 7.9 0.16
2024-04-01 7.5 0.38

146 rows × 2 columns

# Configura o tamanho do gráfico
#plt.figure(figsize = (10,5))
#plt.figure().set_figwidth(15)
#plt.figure().set_figheight(10)
plt.rcParams['figure.figsize'] = [7, 4]
plt.plot(ipca)
plt.style.use('default')

# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

plt.plot(desemprego)
plt.style.use('default')

# Fazendo um Histograma dos dados
# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

plt.hist(x=ipca['IPCA'],
          color = 'darkblue',
          bins = 20)
plt.title("valores de jan de 2010 a abril de 2024")
plt.suptitle("Histograma da variação mensal do IPCA")
plt.style.use('ggplot')

# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

plt.scatter(x=data['desemprego'], y = data['IPCA'])
plt.title("Relação Desemprego x IPCA")
plt.style.use('classic')

# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

sns.set_theme()
sns.lineplot(data=ipca)

# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

sns.displot(data = ipca, x= 'IPCA', kde = True)
<Figure size 1200x800 with 0 Axes>

# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

sns.regplot(data = data, x = 'desemprego', y = 'IPCA')

#Entrada de Dados
mpg_raw = pd.read_excel('dados/mpg.xlsx')
mpg = mpg_raw[['mpg', 'weight', 'horsepower', 'origin', 'cylinders']]

#Estatística Descritiva
mpg.describe()

# Escolhe o tema dos gráficos
sns.set_theme()

# Configura o tamanho do gráfico
plt.figure(figsize = (15,10))

# Gráfico de Histograma
sns.histplot(data = mpg,
             x = 'mpg')

plt.figure(figsize = (15,10))

# Histograma por grupo
sns.displot(data = mpg,
            x = 'mpg',
            col = 'origin')
<Figure size 1200x800 with 0 Axes>

plt.figure(figsize = (15,10))

# Boxplot por grupo
sns.boxplot(data = mpg, 
            x = 'origin',
            y = 'mpg')

plt.figure(figsize = (15,10))

# Correlação e densidade
sns.pairplot(mpg[['mpg', 'weight', 'horsepower','origin']],
             hue = 'origin')
<Figure size 1200x800 with 0 Axes>

Exemplo Prático usando o Yahoo! Finance

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import seaborn as sns
import yfinance as yf

#Lembrar de pegar o Ticker dentro do Site do Yahoo!Finance
# outra opção: tickers = ['^BVSP', 'BRL=X']
dolar_ibov = yf.download("^BVSP BRL=X", 
                        start = "2023-01-04",
                        end = "2024-05-01", 
                        auto_adjust=True)['Close']
                        
#Eliminando os NA's
dolar_ibov = dolar_ibov.dropna()

sns.set()

dolar_ibov.plot(subplots = True, figsize = (20, 6))
array([<Axes: xlabel='Date'>, <Axes: xlabel='Date'>], dtype=object)

# Gráfico de uma correlação móvel no tempo das duas variáveis

dolar_ibov['BRL=X'].rolling(22).corr(dolar_ibov['^BVSP']).plot(figsize = (20,6))

petrobras = yf.download("PETR4.SA")['Close']
                        
#Eliminando os NA's
petrobras = petrobras.dropna()

petrobras.plot(figsize = (22,8))
plt.title('Evolução do preço das ações da Petrobras')
Text(0.5, 1.0, 'Evolução do preço das ações da Petrobras')

Gráfico com o Plotnine

Para criar um gráfico com o plotnine a ideia é a mesma do Ggplot2 no R:

  1. Gráficos são representações visuais de dados em formas geométricas (dispersão, linha, coluna, etc.) com definições estéticas (cor, posição, tamanho, etc.).

  2. Gráficos são criados em camadas, combinando elementos visuais independentes.

# Importa os dados do módulo data
# Importar bibliotecas
import pandas as pd
import plotnine as p9 # !pip install plotnine 
from plotnine.data import mtcars

# Exibe o dataframe
mtcars.head()
name mpg cyl disp hp drat wt qsec vs am gear carb
0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
(p9.ggplot(mtcars) + 
  p9.aes(x = "wt", y = "mpg") +
  p9.geom_point()
  )

(p9.ggplot(mtcars) + 
  p9.aes(x = "wt", y = "mpg", color = "factor(gear)") +
  p9.geom_point() +
  p9.stat_smooth(method = "lm") +
  p9.facet_wrap("gear") +
  p9.theme_minimal() +
  p9.labs(title = "Gráfico do dataset mtcars", 
          subtitle = "Criado com o plotnine no Python")
  )

Para criar um gráfico do plotnine é preciso especificar a camada inicial com a função ggplot(), que recebe como entrada a tabela de dados a serem plotados.

Adicione uma camada de especificação dos eixos X e Y do gráfico com a função aes().

Use sempre o símbolo + para adicionar camadas e coloque a expressão entre parênteses () para escrever em múltiplas linhas.

Para exibir as observações (dados) deve-se escolher uma ou mais geometrias, dentre as várias opções disponíveis (linha, coluna, dispersão, etc.), adicionando uma nova camada com a família de funções geom_*().

Para colorir e diferenciar as observações com base em categorias de uma coluna e inserir uma legenda basta especificar a estética color em aes().

Para alterar as escalas do gráfico (de eixos, de cores, de tamanhos, etc.) existe a família de funções scale_*_*():

Para inserir títulos do gráfico, eixo, legenda, texto de rodapé, etc., adicione camadas de elementos textuais com as funções ggtitle(), ylab(), xlab() e labs().

Para inserir um tema no gráfico existem algumas opções nativas do plotnine, bastando adicionar a camada com a família de funções theme_*().

Para alterar componentes visuais do tema individualmente basta usar a função theme(), que permite definir a estética de todos os componentes existentes no gráfico.

A função é bastante extensa em opções (dezenas de argumentos) e recomenda-se consultar a documentação para detalhes de personalização de cada elemento.

from plotnine.data import meat

meat.head()

meat_long = meat.melt(
    id_vars="date",
    value_vars=["beef", "veal", "pork", "lamb_and_mutton", "broilers", "turkey"],
    var_name="animal",
    value_name="weight"
).dropna()

meat_long.head()

meat_long_monthly_agg = meat_long.groupby("date").agg({"weight": "sum"}).reset_index()
meat_long_monthly_agg


(
    p9.ggplot(meat_long_monthly_agg, p9.aes(x="date", y="weight"))
    + p9.geom_line()
)

Grafico de múltiplas séries

(
    p9.ggplot(meat_long, p9.aes(x="date", y="weight", group="animal"))
    + p9.geom_line()
    # Styling
    + p9.scale_x_datetime(date_breaks="10 years", date_labels="%Y")
    + p9.theme_538()
)

Gráfico com cores diferentes

(
   p9.ggplot(meat_long, p9.aes(x="date", y="weight", color="animal"))
    + p9.geom_line()
    # Styling
    + p9.scale_x_datetime(date_breaks="10 years", date_labels="%Y")
    + p9.theme_538()
)

Gráficos interativos no Python

Os dados abaixo são séries temporais sobre a venda de veículos no Brasil, disponíveis no site do Banco Central.

from bcb import sgs
import plotly.express as px

dados = sgs.get(
    codes = {"Autos": 7384, "Leves": 7385, "Caminhões": 7386, "Ônibus": 7387}, 
    start = "2002-01-01"
    )
dados.tail()
Autos Leves Caminhões Ônibus
Date
2023-12-01 187746 48844 10068 1877
2024-01-01 118503 33553 7993 1546
2024-02-01 120303 34967 8202 1725
2024-03-01 137889 38093 9654 2046
2024-04-01 164365 43713 10553 2182

Para criar um gráfico de linha com o Plotly no Python utiliza-se a função line() do módulo express, conforme abaixo:

# Gráfico de linha
fig = px.line(
    data_frame = dados, 
    x = dados.index, 
    y = dados.columns, 
    title = "Vendas de Veículos nas Concessionárias do Brasil",
    labels = {"value": "Unidades", "Date": "Período", "variable": "Tipo"}
    )
    
fig.show()

Ambiente Controlado dentro do Python

O def cria uma função. No exemplo abaixo,

def f(x):
  return 10*x + 40
f(2)
60
def iguala30(x):
  if x > 30:
    print("maior")
  else:
    print("menor")

iguala30(31)
maior
iguala30(22)
menor

No caso dos loopings, deve-se usar while ou for:

def repetir(n):
  i = 5
  while(i < n):
      print(i)
      i = i + 1
  else:
      print("Fim da Repetição")
      
repetir(10)
5
6
7
8
9
Fim da Repetição
def carac(x):
  for a in x:
    print(a, len(a))
    
carac(['comida', 'café', 'chocolate'])
comida 6
café 4
chocolate 9